{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "56a320e3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1\n",
      "                   0, loss:0.605905294418335\n",
      "                 100, loss:0.009273678995668888\n",
      "                 200, loss:0.001176997902803123\n",
      "                 300, loss:0.0032012853771448135\n",
      "                 400, loss:0.010229676030576229\n",
      "                 500, loss:0.0008440657984465361\n",
      "                 600, loss:0.0048056310042738914\n",
      "                 700, loss:0.006206963676959276\n",
      "                 800, loss:0.00021743617253378034\n",
      "                 900, loss:0.0005030706524848938\n",
      "                1000, loss:0.0023395391181111336\n",
      "                1100, loss:0.00023422081721946597\n",
      "                1200, loss:0.0006596719031222165\n",
      "                1300, loss:0.0004937669727951288\n",
      "                1400, loss:0.0005537490942515433\n",
      "                1500, loss:0.0004481936921365559\n",
      "                1600, loss:0.0003064746269956231\n",
      "                1700, loss:5.722191417589784e-05\n",
      "                1800, loss:0.0006832813378423452\n",
      "                1900, loss:0.0017770271515473723\n",
      "                2000, loss:0.00020911276806145906\n",
      "                2100, loss:0.0010089932475239038\n",
      "                2200, loss:0.000650690752081573\n",
      "                2300, loss:0.0002481808769516647\n",
      "                2400, loss:0.0006949126836843789\n",
      "                2500, loss:0.00032024722895585\n",
      "                2600, loss:0.00033721589716151357\n",
      "                2700, loss:0.00032592055504210293\n",
      "                2800, loss:0.00017612279043532908\n",
      "                2900, loss:0.0007009578985162079\n",
      "                3000, loss:0.0002784571552183479\n",
      "                3100, loss:0.0010536336340010166\n",
      "                3200, loss:0.00016203145787585527\n",
      "                3300, loss:0.0008756467141211033\n",
      "                3400, loss:0.0001152081968029961\n",
      "                3500, loss:0.0001243720471393317\n",
      "                3600, loss:0.0003200275241397321\n",
      "                3700, loss:0.0006245266413316131\n",
      "                3800, loss:0.0006926573114469647\n",
      "                3900, loss:0.00021204219956416637\n",
      "                4000, loss:6.97967698215507e-05\n",
      "                4100, loss:0.0004006388480775058\n",
      "                4200, loss:0.0003204898675903678\n",
      "                4300, loss:0.0006700638332404196\n",
      "                4400, loss:0.00019849663658533245\n",
      "                4500, loss:0.0006934352568350732\n",
      "                4600, loss:0.00019872903067152947\n",
      "                4700, loss:0.00044139797682873905\n",
      "                4800, loss:0.0011816872283816338\n",
      "                4900, loss:0.00022832612739875913\n",
      "                5000, loss:0.00019192507897969335\n",
      "                5100, loss:0.00019859266467392445\n",
      "                5200, loss:0.000492885010316968\n",
      "                5300, loss:0.00022888231615070254\n",
      "                5400, loss:7.284446473931894e-05\n",
      "                5500, loss:0.00023346526722889394\n",
      "                5600, loss:0.000359333906089887\n",
      "                5700, loss:0.0007502516964450479\n",
      "                5800, loss:0.0003311628242954612\n",
      "                5900, loss:0.0002709589898586273\n"
     ]
    },
    {
     "data": {
      "image/png": "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5Zds2rQp2EuJOPn5+fzkJz9h7dq1dO7cOdjLiVimaZKZmcmiRYsAuOqqq/j66695+eWXFby0o2XLlvGnP/2Jv/zlL1xxxRVs27aNefPmkZqayj333BPs5UU8wzDq/dqyrEaPiU3BS4T713/9V1asWMHHH39M3759g72ciPPZZ59RWFjINddcU/eYy+Xi448/5sUXX6SyshKn0xnEFUaG3r17k5GRUe+xyy+/nDfffDNIK4pMDz30EI888gjf+973ABg+fDiHDh3imWeeUfDiR7169QLsHZjevXvXPV5YWNhoN0ZsynmJUJZl8cADD/C3v/2NDz/8kIEDBwZ7SRFpwoQJ7Nixg23bttV9ZWZm8v3vf59t27YpcGkn1113XaNS/z179tC/f/8grSgynTt3Doej/o8Fp9OpUmk/GzhwIL169WLdunV1j1VVVbFhwwbGjh0bxJWFLu28RKgf//jH/OUvf+Htt9+me/fudWeq8fHxdOnSJcirixzdu3dvlEfUrVs3EhMTlV/Ujv7t3/6NsWPHsmjRImbMmEF2djavvPIKr7zySrCXFlGmTp3KwoUL6devH1dccQVffPEFL7zwAvfee2+wlxb2ysvL2bdvX92vDxw4wLZt20hISKBfv37MmzePRYsWMXjwYAYPHsyiRYvo2rUrd999dxBXHcIsiUiAx68//OEPwV5axLvxxhutn/zkJ8FeRsRZuXKlNWzYMCsmJsZKT0+3XnnllWAvKeKUlZVZP/nJT6x+/fpZnTt3ti699FLr8ccftyorK4O9tLD30Ucfebwn33PPPZZlWZZpmtYTTzxh9erVy4qJibFuuOEGa8eOHcFddAhTnxcREREJK8p5ERERkbCi4EVERETCioIXERERCSsKXkRERCSsKHgRERGRsKLgRURERMKKghcREREJKwpeREREJKwoeBEREZGwouBFREREwoqCFxEREQkrCl5EREQkrPz/W3U+QgKZ9UgAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "import numpy as np\n",
    "from matplotlib import pyplot as plt\n",
    "print(1)\n",
    "num_time_steps = 50\n",
    "input_size=1\n",
    "hidden_size=16\n",
    "output_size=1\n",
    "lr=0.01\n",
    "\n",
    "class Net(nn.Module):\n",
    "    def __init__(self, *args, **kwargs) -> None:\n",
    "        super().__init__(*args, **kwargs)\n",
    "        self.rnn = nn.RNN(input_size=input_size, hidden_size=hidden_size, num_layers=1, batch_first=True)\n",
    "        for p in self.rnn.parameters():\n",
    "            nn.init.normal_(p, mean=0.0, std=0.001)\n",
    "\n",
    "        self.linear = nn.Linear(hidden_size, output_size)\n",
    "\n",
    "    def forward(self, x, hidden_prev):\n",
    "        out, hidden_prev = self.rnn(x, hidden_prev)\n",
    "        out = out.view(-1, hidden_size)\n",
    "        out = self.linear(out)\n",
    "        out = out.unsqueeze(dim=0)\n",
    "        return out, hidden_prev\n",
    "\n",
    "model = Net()\n",
    "criterion = nn.MSELoss()\n",
    "optimizer = optim.Adam(model.parameters(), lr)\n",
    "\n",
    "hidden_prev = torch.zeros(1, 1, hidden_size)\n",
    "\n",
    "for iter in range(6000):\n",
    "    start = np.random.randint(3, size=1)[0]\n",
    "    time_steps = np.linspace(start, start + 10, num_time_steps)\n",
    "    data = np.sin(time_steps)\n",
    "    data = data.reshape(num_time_steps, 1)\n",
    "    # x = torch.tensor(data[:-1].astype(float).view(1, num_time_steps -1, 1))\n",
    "    # y = torch.tensor(data[1:].astype(float).view(1, num_time_steps -1, 1))\n",
    "    x = torch.tensor(data[:-1].reshape(1, num_time_steps -1, 1)).float()\n",
    "    y = torch.tensor(data[1:].reshape(1, num_time_steps -1, 1)).float()\n",
    "    output, hidden_prev = model(x, hidden_prev)\n",
    "    hidden_prev = hidden_prev.detach()\n",
    "\n",
    "    loss = criterion(output, y)\n",
    "    model.zero_grad()\n",
    "    loss.backward()\n",
    "\n",
    "    optimizer.step()\n",
    "\n",
    "    if iter % 100 == 0:\n",
    "        print(f\"{iter:=20}, loss:{loss}\")\n",
    "\n",
    "start = np.random.randint(3)\n",
    "time_steps = np.linspace(start, start + 10, num_time_steps)\n",
    "#生成一维线性空间\n",
    "'''\n",
    "array([ 0.        ,  0.20408163,  0.40816327,  0.6122449 ,  0.81632653,\n",
    "        1.02040816,  1.2244898 ,  1.42857143,  1.63265306,  1.83673469,\n",
    "        2.04081633,  2.24489796,  2.44897959,  2.65306122,  2.85714286,\n",
    "        3.06122449,  3.26530612,  3.46938776,  3.67346939,  3.87755102,\n",
    "        4.08163265,  4.28571429,  4.48979592,  4.69387755,  4.89795918,\n",
    "        5.10204082,  5.30612245,  5.51020408,  5.71428571,  5.91836735,\n",
    "        6.12244898,  6.32653061,  6.53061224,  6.73469388,  6.93877551,\n",
    "        7.14285714,  7.34693878,  7.55102041,  7.75510204,  7.95918367,\n",
    "        8.16326531,  8.36734694,  8.57142857,  8.7755102 ,  8.97959184,\n",
    "        9.18367347,  9.3877551 ,  9.59183673,  9.79591837, 10.        ])\n",
    "'''\n",
    "data = np.sin(time_steps)\n",
    "data = data.reshape(num_time_steps, 1) # \n",
    "x = torch.tensor(data[:-1].reshape(1, num_time_steps -1, 1)).float()\n",
    "y = torch.tensor(data[1:].reshape(1, num_time_steps -1, 1)).float()\n",
    "\n",
    "predictions = []\n",
    "input = x[:,0,:]\n",
    "\n",
    "for _ in range(x.shape[1]):\n",
    "    input = input.view(1, 1, 1)\n",
    "    (pred, hidden_prev) = model(input, hidden_prev)\n",
    "    input = pred\n",
    "    predictions.append(pred.detach().numpy().ravel()[0])\n",
    "\n",
    "x = x.data.numpy().ravel()\n",
    "y = y.data.numpy()\n",
    "plt.scatter(time_steps[:-1], x.ravel(), s=90)\n",
    "plt.plot(time_steps[:-1], x.ravel())\n",
    "plt.scatter(time_steps[1:], predictions)\n",
    "plt.show()\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2366d0ea",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
